package dvsdk.form;


import dvsdk.client.BinColumn;
import dvsdk.client.BinResult;
import dvsdk.client.BinRow;
import dvsdk.db.Base;
import dvsdk.db.BinComboUser;
import dvsdk.db.GlobalConfig;
import java.awt.Component;
import java.awt.GraphicsConfiguration;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.JTextComponent;


/**
 *
 * @author Develop
 */
public class Util {
    public static final int F_SALE_KVARTIR=0;
    public static final int F_SALE_KOMNTAT=1;
    public static final int F_SALE_DOLI=2;
    public static final int F_SALE_KOMMERS=3;
    public static final int F_SALE_DOM=4;
    public static final int F_SALE_GARAZG=5;
    
    public static final int F_RENT_KVARTIR=0;
    public static final int F_RENT_KOMNTAT=1;
    public static final int F_RENT_KOMMERS=2;
    public static final int F_RENT_DOM=3;
    public static final int F_RENT_GARAZG=4;
    
    public static final int F_SALE=0;
    public static final int F_RENT=1;

    /**
     * Проверка на пустое значение строки
     * @param jtc
     * @return true/false
     */
    public static boolean isClean(String jtc) {
        String s = jtc.trim();
        if (s == null)
            return false;
        return s.equals("");
    }
    /**
     * Проверка на пустое значение JTextComponent
     * @param jtc
     * @return true/false
     */
    public static boolean isClean(JTextComponent jtc) {
        return isClean(jtc.getText());
    }
    
    public static void sortAllRowsBy(DefaultTableModel dtm, int colIndex, boolean asc) {
        Vector data = dtm.getDataVector();
        //Collections.sort(data, new Colu);
    }
    
    /**
     * Заполнить модель таблицы
     * @param table
     * @param nameCols 
     */
    public static void fillTableModel(JTable table, List<BinColumn> nameCols){
        DefaultTableModel dtm = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int rowIndex, int mColIndex) {
                return false;
            }
        };
        for (Iterator<BinColumn> it = nameCols.iterator(); it.hasNext();) {
            BinColumn bc = it.next();
            dtm.addColumn(bc.getName());
        }
        table.setModel(dtm);
        table.setAutoCreateColumnsFromModel(false);
        table.setAutoCreateRowSorter(true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
       // dtm.setDataVector(null, null);
        
        for (int i = 0; i < dtm.getColumnCount(); i++) {
            boolean show=(nameCols.get(i).getPosition()==-1)?false:nameCols.get(i).isShow();
            //table.getColumnModel().getColumn(i).setModelIndex(nameCols.get(i).getPosition());
            table.getColumnModel().getColumn(i).setPreferredWidth((nameCols.get(i).isShow())?nameCols.get(i).getSize():0);
            table.getColumnModel().getColumn(i).setMinWidth((show)?(nameCols.get(i).getMin()==0?nameCols.get(i).getSize():nameCols.get(i).getMin()):0);
            table.getColumnModel().getColumn(i).setMaxWidth((show)?(nameCols.get(i).getMax()==0?nameCols.get(i).getSize()*3:nameCols.get(i).getMax()):0);
        }
        
    }
    
    public static void createRowTable(List<BinResult> results, JTable table) {
        table.setAutoCreateRowSorter(true);
        for (Iterator<BinResult> it = results.iterator(); it.hasNext();) {
            BinResult binResult = it.next();
        }
    }
    
    /**
     * Инициализировать таблицу
     * @param base
     * @param table
     * @param frame
     * @param drop
     * @return 
     */
    public static String initBaseTable(Base base,JTable table, JFrame frame, boolean drop) {
        BinResult params = Util.getBinResult(frame);
        String ret_params=Util.getBinResult(frame).getParamsSQL().trim();
        String tmp_par=params.getParamsCreateSQL().trim();
        if (drop) { 
            ExUtil.initReTable(base,frame.getName(), tmp_par);
        } else ExUtil.initTable(base,frame.getName(), tmp_par);
        Util.fillTableModel(table, Util.fillTableColsFromFrame(frame));
        frame.dispose();
        return ret_params;
    }
    
    /**
     * Получить данные элементов на форме
     * @param frame
     * @return 
     */
    public static BinResult getBinResult(JFrame frame){
        BinResult binResult = new BinResult(Util.scanJFrame(frame));
        return binResult;
    }
    
    /**
     * Создать колонки для таблицы
     * @param frame
     * @return 
     */
    public static List<BinColumn> fillTableColsFromFrame(JFrame frame) {
        List<BinColumn> colsTable= new ArrayList();
        BinResult binResult = new BinResult(frame);
        List<BinRow> binRow = binResult.getRows();
        for (String str : GlobalConfig.STR_FIELDS_ARR()) 
            colsTable.add(new BinColumn(str, false));
        for (Iterator<BinRow> it = binRow.iterator(); it.hasNext();) {
            BinRow binRowIn = it.next();
            String params[] = binRowIn.getParams().trim().split("\\|"); 
            if (params.length==1) colsTable.add(new BinColumn(binRowIn.getAlias(), Integer.parseInt(params[0])));
            if (params.length==2) colsTable.add(new BinColumn(binRowIn.getAlias(), Integer.parseInt(params[1]), Integer.parseInt(params[0])));
            if (params.length==3) colsTable.add(new BinColumn(binRowIn.getAlias(), Integer.parseInt(params[0]), Integer.parseInt(params[1]), Integer.parseInt(params[2])));
            if (params.length==4) colsTable.add(new BinColumn(binRowIn.getAlias(), Integer.parseInt(params[1]), Integer.parseInt(params[0]), Integer.parseInt(params[2]), Integer.parseInt(params[3])));
        }
        return colsTable;
    }
    
    /**
     * Добавить таблицу на фрейм
     * @param panel
     * @param nameCols
     * @param tableName 
     */
    public static void addTableToPanel(JPanel panel, List<BinColumn> nameCols, String tableName) {
        JTable jTable = new JTable();
        jTable.setName(tableName);
        Util.fillTableModel(jTable, nameCols);
        JScrollPane jScrollPane = new JScrollPane();
        jScrollPane.add(jTable);
        jScrollPane.setViewportView(jTable);
        panel.add(jScrollPane);
    }
   
    
    /**
     * Проверить объект, если в конце имени есть '*'
     * @param object
     * @return 
     */
    public static boolean testJObject(Object object) {
        
            if ( ((Component)object).getName()==null) return true;
            
            if (object instanceof JTextField) {
                //if (((JTextField)object).getName()!=null)
                if (((JTextField)object).getName().endsWith("*")) {
                    if (((JTextField)object).getText().trim().isEmpty()) return false;
                }
            }
            if (object instanceof JSpinner) {
                if (((JSpinner)object).getName().endsWith("*")) {
                    if (((JSpinner)object).getValue().toString().equals("0")) return false;
                }
            }
            if (object instanceof JComboBox) {
                if (((JComboBox)object).getName().endsWith("*")) {
                    if (((JComboBox)object).getSelectedItem().toString().trim().isEmpty()) return false;
                }
            }
            if (object instanceof JTextArea) {
                if (((JTextArea)object).getName().endsWith("*")) {
                    if (((JTextArea)object).getText().trim().isEmpty()) return false;
                }
            }
        return true;
    }
    
    /**
     * Сделать активным/добавить в JComboBox элемент
     * @param comboBox
     * @param value 
     */
    public static void setActiveComboBox(JComboBox comboBox, String value) {
        for (int i = 0; i < comboBox.getModel().getSize(); i++) {
            if (comboBox.getModel().getElementAt(i).toString().equals(value)) {comboBox.setSelectedIndex(i); return;}
        }
        comboBox.addItem(value);
        comboBox.setSelectedIndex(comboBox.getModel().getSize());
    }
    
    /**
     * Сканировать и заполнить элементы на фреймам
     * @param incom
     * @param name
     * @param value 
     */
    public static void fillJFrameObject(Object incom, String name, String value) {
        Component[] components = (incom instanceof JPanel)?((JPanel)incom).getComponents():((JFrame)incom).getContentPane().getComponents();
        for (Object object : components) {
            if (object instanceof JPanel) {
                fillJFrameObject(incom, name, value);
            }
            if (object instanceof JFrame) {
                fillJFrameObject(incom, name, value);
            }
            
            if ( ((Component)object).getName()==null) continue;
            
            if (object instanceof JTextField) {
                if (((JTextField)object).getName().equals(name)) ((JTextField)object).setText(value);
            }
            if (object instanceof JSpinner) {
                if (((JSpinner)object).getName().equals(name)) ((JSpinner)object).setValue(Integer.parseInt(value));
            }
            if (object instanceof JComboBox) {
                if (((JComboBox)object).getName().equals(name)) setActiveComboBox((JComboBox)object,value);
            }
            if (object instanceof JCheckBox) {
                if (((JCheckBox)object).getName().equals(name)) { if (value.equals("0")) { ((JCheckBox)object).setSelected(false); } else { ((JCheckBox)object).setSelected(true); } }
            }
            if (object instanceof JTextArea) {
                if (((JTextArea)object).getName().equals(name)) ((JTextArea)object).setText(value);
            }
        }
    }
    
    /**
     * Заполняем фрейм данными
     * @param frame
     * @param binRows 
     */
    public static void fillJFrame(JFrame frame, List<BinRow> binRows){
        for (Iterator<BinRow> it = binRows.iterator(); it.hasNext();) {
            BinRow binRow = it.next();
            fillJFrameObject(frame, binRow.getName(), binRow.getValue());
        }
    }

    /**
     * Сформировать фильтр из JToggle
     * @param incom JFrame
     * @return "room>=4 and new=1" //пример
     */
    public static String getSQLWhere(Object incom){
        List<String> sql = scanJToggle(incom);
        String ret="";
        if (sql.isEmpty()) return ret;
        
        for (Iterator<String> it = sql.iterator(); it.hasNext();) {
            String string = it.next();
            ret+=string+((it.hasNext())?" and ":" ");
        }
        if (GlobalConfig.DEBUG) System.out.println(ret);
        return ret;
    }
    
    /**
     * Сканировать фрейм рекурсивно на наличие JToggle
     * @param incom
     * @return List getAccessibleDescription()
     */
    public static List<String> scanJToggle(Object incom){
        List<String> ret= new ArrayList();
        Component[] components = (incom instanceof JPanel)?((JPanel)incom).getComponents():((JFrame)incom).getContentPane().getComponents();
        for (Object object : components) {
            if (object instanceof JPanel) {
                ret.addAll(scanJToggle((JPanel)object));
            }
            if (object instanceof JFrame) {
                ret.addAll(scanJToggle((JFrame)object));
            }
            
            if ( ((Component)object).getAccessibleContext().getAccessibleDescription()==null ) continue;
            
            if (object instanceof JToggleButton) {
                if (((JToggleButton)object).isSelected()) {
                    if (!((JToggleButton)object).getAccessibleContext().getAccessibleDescription().isEmpty())
                        ret.add(((JToggleButton)object).getAccessibleContext().getAccessibleDescription().trim());
                }
            }
        }
        return ret;
    }  
    
    /**
     * Сканировать фрейм рекурсивно
     * @param incom
     * @return 
     */
    public static List<BinRow> scanJFrame(Object incom){
        List<BinRow> ret= new ArrayList();
        Component[] components = (incom instanceof JPanel)?((JPanel)incom).getComponents():((JFrame)incom).getContentPane().getComponents();
        for (Object object : components) {
            
            if (object instanceof JPanel) {
                ret.addAll(scanJFrame((JPanel)object));
            }
            if (object instanceof JFrame) {
                ret.addAll(scanJFrame((JFrame)object));
            }
            if ( ((Component)object).getName()==null) continue;
            
            if (object instanceof JTextField) {
                    boolean tmpTest=testJObject(object);
                    ret.add(new BinRow(((JTextField)object).getName(), ((JTextField)object).getText(), ((JTextField)object).getAccessibleContext().getAccessibleName(), ((JTextField)object).getAccessibleContext().getAccessibleDescription(), tmpTest));
                    if (!tmpTest) ((JTextField)object).requestFocusInWindow();
            }
            /*if (object instanceof JButton) {
                ret.add(new BinRow(((JButton)object).getName(), ((JButton)object).getText()));
            }*/
            if (object instanceof JSpinner) {
                boolean tmpTest=testJObject(object);
                ret.add(new BinRow(((JSpinner)object).getName(), ((JSpinner)object).getValue().toString(), ((JSpinner)object).getAccessibleContext().getAccessibleName(), ((JSpinner)object).getAccessibleContext().getAccessibleDescription(), tmpTest));
                if (!tmpTest) ((JSpinner)object).requestFocusInWindow();
            }
            if (object instanceof JComboBox) {
                boolean tmpTest=testJObject(object);
                ret.add(new BinRow(((JComboBox)object).getName(), ((JComboBox)object).getSelectedItem().toString(), ((JComboBox)object).getAccessibleContext().getAccessibleName(), ((JComboBox)object).getAccessibleContext().getAccessibleDescription(), tmpTest));
                if (!tmpTest) ((JComboBox)object).requestFocusInWindow();
            }
            if (object instanceof JCheckBox) {
                boolean tmpTest=testJObject(object);
                ret.add(new BinRow(((JCheckBox)object).getName(), ((JCheckBox)object).isSelected()?"1":"0", ((JCheckBox)object).getAccessibleContext().getAccessibleName(), ((JCheckBox)object).getAccessibleContext().getAccessibleDescription(), tmpTest));
                if (!tmpTest) ((JCheckBox)object).requestFocusInWindow();
            }
            if (object instanceof JTextArea) {
                boolean tmpTest=testJObject(object);
                ret.add(new BinRow(((JTextArea)object).getName(), ((JTextArea)object).getText(), ((JTextArea)object).getAccessibleContext().getAccessibleName(), ((JTextArea)object).getAccessibleContext().getAccessibleDescription(), tmpTest));
                if (!tmpTest) ((JTextArea)object).requestFocusInWindow();
            }
        }
        return ret;
    }
    
    /**
     * Очистить строку от знака '*'
     * @param str
     * @return 
     */
    public static String clearStr(String str){
        return str.replace('*', ' ').trim();
    }
    
    public static int findElementRS(ResultSet irs, String col, String val) {
        try {
            while(irs.next()) {
                if (irs.getString(col).equals(val)) return irs.getRow();
            }
        } catch (Exception ex) {
            System.err.println(ex.getLocalizedMessage());
            //Logger.getLogger(Base.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex);
        }
        return -1;
    }
    
    public static String getCurDate() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        Date date = new Date();
        return dateFormat.format(date);
    }
    
    public static void fillUserComboBox(List<BinComboUser> list, JComboBox box) {
        box.removeAllItems();
        for (Iterator it = list.iterator(); it.hasNext();) {
            BinComboUser object = (BinComboUser) it.next();
            box.addItem(object.getName()+" #"+object.getInn());
        } 
    }
    
    public static void fillComboBox(List list, JComboBox box) {
        box.removeAllItems();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Object object = it.next();
            box.addItem(object.toString());
            
        }
    }
    
    public static String getMD5(String str) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(str.getBytes(),0,str.length());
            return new BigInteger(1,messageDigest.digest()).toString(16);
        } catch (Exception ex) {
            System.err.println(ex.getLocalizedMessage()); return "error";
        }
    }
    
    /**
     * Растягиваем окно на всю рабочую область
     * @param frame 
     */
    public static void maxiSizer(JFrame frame){
        // Растягиваем окно на всю рабочую область
        GraphicsConfiguration gc = frame.getGraphicsConfiguration();
        Rectangle bounds = gc.getBounds();
        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= insets.left + insets.right;
        bounds.height -= insets.top + insets.bottom;
        frame.setBounds(bounds.x, bounds.y, bounds.width, bounds.height);  
    }
}